home *** CD-ROM | disk | FTP | other *** search
- ========================================================================
- v0.8 22 Jan 98
- ------------------------------------------------------------------------
- Lowered volume of music in amiga_music.s, got rid of clicks. Also
- lowered volume of sound effects in amiga_sound.c. Only the lower half
- of the volume control was being used before.
-
- ------------------------------------------------------------------------
- Now compile with OPTSCHEDULE sc option.
-
- ------------------------------------------------------------------------
- Added code to amiga_video.c for -fps option for displaying frames per
- second in top-left corner.
-
- ------------------------------------------------------------------------
- For 68040/68060 + AGA, now use comparison buffer C2P routine if window
- is smaller than SCREENSIZE-64, else use non-comparison buffer C2P.
-
- ------------------------------------------------------------------------
- Disabled "S_StartSoundAtVolume: 16bit and not pre-cached - wtf?" msg
- in s_sound.c with -nosfx.
-
- ------------------------------------------------------------------------
- Added -heapsize option in amiga_system.c for specifying zone size in
- kilobytes.
-
- ------------------------------------------------------------------------
- Rewrote R_RenderSegLoop() (in r_segs.c) in assembly language (to
- amiga_draw.s) and hand-optimised it a bit.
-
- ------------------------------------------------------------------------
- Fixed (harmless) missing #endif in d_main.c.
-
- ------------------------------------------------------------------------
- There appears to be a bug in r_things.c. The code:
-
- check = namelist;
- while (*check != NULL)
- check++;
-
- scans for a NULL which doesn't exist on the end of the namelist array
- (unless you're lucky --- it's just whatever comes after the array in
- memory). Fixed by making the sprnames[] array 1 element longer in
- info.c and info.h and initialising the last element to NULL. I wonder
- if this fixed the "PNAMES not found" bug.
-
- ------------------------------------------------------------------------
- Compiled everything with DATA=NEAR. This involved finding the dozen
- or so largest data structures throughout all files and declaring them
- with FAR, so the remainder fitted within 64kb. Added the following
- lines to doomdef.h:
-
- #ifdef __SASC
- #define FAR __far
- #else
- #define FAR
- #endif
-
- Added #include "doomdef.h" to several files to get the FAR definition.
-
- ------------------------------------------------------------------------
- Applied patch supplied by Aki to DrawColumn_060() in amiga_draw.s to
- fix problem with red stairs and random pixels on 68060.
-
- ------------------------------------------------------------------------
- Changed most routines in amiga_draw.s to use near A4-relative
- addressing of variables. Couldn't figure out how to do this with
- Macro68 (because DT base for A4 is external) so used SAS/C asm
- instead. Had to convert back to old syntax and manually optimise
- branches.
-
- ------------------------------------------------------------------------
- Applied patches supplied by Cyril Deble to d_main.c and am_map.c for
- new -rotatemap and -maponhu options.
-
- ========================================================================
- v0.7 16 Jan 98
- ------------------------------------------------------------------------
- Version 0.6 had a serious bug in c2p8_040_amlaukka.s which caused
- crashes on 68040+AGA and 68060+AGA machines. Fixed with patch
- supplied by Aki Laukkanen.
-
- ------------------------------------------------------------------------
- Version 0.6 had a serious bug in the use_mmu cleanup code which caused
- crashes one exit when -mmu or MMU was used. Fixed with patch supplied
- by Aki Laukkanen.
-
- ------------------------------------------------------------------------
- Commenting out the Macro68 debug statements in the *.s files made the
- executable much smaller.
-
- ========================================================================
- v0.6 15 Jan 98
- ------------------------------------------------------------------------
- Applied patches to amiga_music.s as supplied by Joe Fenton.
- Also added code to set correct frequency for PAL or NTSC instead of
- assuming NTSC.
-
- ------------------------------------------------------------------------
- Applied patches to column and span drawing routines in amiga_draw.s as
- supplied by Aki Laukkanen. This fixed all the bright dots scattered
- around floors and ceilings, and the red stairs at the start. Disabled
- various routines in r_draw.c, r_segs.c and r_things.c that are
- replaced by routines in amiga_draw.s.
-
- ------------------------------------------------------------------------
- Now use FPU for FixedMul() on 68060. Joe Fenton says "2 FP multiplies
- beat the hell out of 4 word multiplies, plus the associated adds and
- swaps". Added SetFPMode() routine to amiga_fixed.s to set FPU
- rounding mode to "round towards minus infinity". Otherwise WAD demos
- got out of step and went wrong when using FPU for multiply.
-
- ------------------------------------------------------------------------
- In p_map.c, undid the patch I made in version 0.0 by changing line:
-
- if (ld->special && numspechit < MAXSPECIALCROSS)
-
- back to:
-
- if (ld->special)
-
- Instead added code in p_map.c and p_enemy.c to check bounds of all
- spechit[] array accesses. With MAXSPECIALCROSS == 8, got lots of
- array out of bounds accesses, especially in 2nd level of DOOM II.
- Changed MAXSPECIALCROSS from 8 to 20. That got rid of them.
-
- ------------------------------------------------------------------------
- After several hours of stepping through with CPR, finally found and
- fixed the bug that made the Doom II "Dead Simple" level impossible to
- complete. For the function pointer comparison in the line:
-
- if (th->function.acp1 != (actionf_p1)P_MobjThinker)
-
- in p_enemy.c, SAS/C generated code which compared acp1 with the
- address of the ALV (JMP instruction) for P_MobjThinker() instead of
- the address of the P_MobjThinker() function itself. Thus the test
- always failed, even when the function pointers were the same. Fixed
- by compiling everything with ABSFUNCPOINTER.
-
- I reported this to Steve Krueger at SAS. He replied:
-
- "It's not a bug, but rather a limitation of the CODE=NEAR model. We
- even document this in the manual, and provide an option to work around
- it if you still want to use CODE=NEAR. Check the manual for
- information on the ABSFUNCTIONPOINTER option.
-
- ------------------------------------------------------------------------
- Found and fixed the crash on exit bug when music is enabled. Register
- a0 wasn't initialised to _custom in FreeChannels() in amiga_music.s.
-
- ------------------------------------------------------------------------
- Added -nosfx option and tooltype for disabling sound effects and
- leaving audio channels free.
-
- ------------------------------------------------------------------------
- Added Aki Laukkanen's code to amiga_video.c for marking screens[0] and
- the video raster as "imprecise" with the MMU when the -mmu option is
- specified. This should create a slight speedup for 68060.
-
- ------------------------------------------------------------------------
- Started adding code for -directcgx option for rendering directly to
- framebuffer of any video card running CyberGraphX. Discovered it
- flickers badly and needs double or triple-buffering. Started adding
- code for double-buffering, but didn't get logic for interaction with
- I_ReadScreen() right. Still haven't got LockBitMapTags() and
- UnLockBitMap() called from the right places, so sometimes tries to
- write to framebuffer (screens[0]) while not locked. This may corrupt
- other screens if you flip or drag screens while running with
- -directcgx.
-
- ------------------------------------------------------------------------
- Applied patches from Aki Laukkanen to get low detail mode working.
- This included substantial changes to amiga_draw.s and r_draw.c. The
- assembly routines Aki supplied for R_DrawFuzzColumn(),
- R_DrawFuzzColumnLow(), R_DrawTranslatedColumn() and
- R_DrawTranslatedColumnLow() didn't appear to work right, so reverted
- to C versions in r_draw.c.
-
- ========================================================================
- v0.5 8 Jan 98
- ------------------------------------------------------------------------
- Added music code in amiga_music.s based on Joseph Fenton .MUS player.
- Changed amiga_sound.s to use only 2 channels for sound effects when
- music is enabled, and 4 channels when music is disabled. Added
- MIDI_Instruments and MIDI_Instruments.s to archive. MIDI_Instruments.s
- isn't actually used, but it's helpful for understanding the instrument
- format.
-
- ------------------------------------------------------------------------
- Added Aki Laukkanen's latest 68040 and 68060-optimised column and span
- renderers in amiga_draw.s. Modified r_main.c and r_draw.h to handle
- different DrawColumn_040(), DrawColumn_060(), DrawSpan_040() and
- DrawSpan_060(). Aki sent me some more fast C2P and MMU routines but I
- haven't got those working yet.
-
- ------------------------------------------------------------------------
- The call to BestModeID() in amiga_video.c had an unterminated taglist.
- Fixed.
-
- ------------------------------------------------------------------------
- Added Aki's 68060 versions of FixedMul() and FixedDiv() in amiga_fixed.s.
- 68060 FixedDiv uses FPU. If there is no FPU, fall back to 68040 version.
- Added code to select appropriate routines in amiga_main.c.
- Changed FixedMul() definitions in m_fixed.h to look like this:
- extern fixed_t (*FixedMul) (fixed_t a, fixed_t b);
- extern fixed_t (*FixedDiv) (fixed_t a, fixed_t b);
- fixed_t FixedMul_040 (fixed_t a, fixed_t b);
- fixed_t FixedMul_060 (fixed_t a, fixed_t b);
- fixed_t FixedDiv_040 (fixed_t a, fixed_t b);
- fixed_t FixedDiv_060fpu (fixed_t a, fixed_t b);
- /* fixed_t FixedDiv2 (fixed_t a, fixed_t b); */
-
- ------------------------------------------------------------------------
- Added code to amiga_video.c to check version numbers before trying to
- call BestModeID() and put up a screenmode requester. Explicitly
- declared LowLevelBase so it doesn't try and autoopen lowlevel.library.
-
- ------------------------------------------------------------------------
- Fixed I_WaitVBL() in amiga_video.c to call WaitTOF(). It's only
- called on exit to delay long enough to hear the final sound effect.
-
- ========================================================================
- v0.4
- ------------------------------------------------------------------------
- Gamma correction wasn't working in ECS mode. Fixed in I_Palette()
- in amiga_video.c.
-
- ------------------------------------------------------------------------
- I think I finally found the cause of the 80000003 crash on exit. It
- was caused by 2 missing commas in the initialisation strings for
- endmsg[] in dstrings.c following the strings: "go ahead and leave. see
- if i care." and "you're lucky i don't smack\nyou for thinking about
- leaving.". Fixed.
-
- ------------------------------------------------------------------------
- Added 68020/30 optimised C2P routine in c2p_020.s. Use blitter for
- final passes which means double-buffering is required to eliminate
- otherwise severe flicker. Implemented double-buffering for all planar
- modes in amiga_video.c.
-
- ------------------------------------------------------------------------
- Found that the last QBlit() pass finished while the main program was
- in the middle of 3D rendering. This meant the ChangeScreenBuffer()
- call was delayed until the end of rendering. The program felt very
- sluggish, even though the frame-rate was higher than before because
- there was a much longer delay between pressing a key and seeing the
- result happen on the screen. To solve this I created a new subtask
- which simply calls ChangeScreenBuffer() in a loop when signalled from
- the QBlit() cleanup function. This way the main engine is interrupted
- to call ChangeScreenBuffer() at the earliest opportunity. Extensive
- changes are in amiga_video.c.
-
- ------------------------------------------------------------------------
- Gabry (ggreco@iol.it) emailed me some CD32 joypad handling code. I
- included it in amiga_video.c (disabled by default) but I can't test
- it. To enable it, use the -joypad option or JOYPAD tooltype.
-
- ------------------------------------------------------------------------
- Several people sent me faster replacements for R_DrawColumn() and
- R_DrawSpan() in amiga_draw.s, but so far only one of them worked
- right.
-
- ========================================================================
- v0.3
- ------------------------------------------------------------------------
- Low detail code doesn't work, so disabled detail level toggle in
- m_menu.c. Previously setting low detail and then resizing screen
- corrupted graphics.
-
- ------------------------------------------------------------------------
- Added ClearPointer() call before CloseWindow() in amiga_video.c.
- Let's see if that fixes the crash on exit. Hmm, seems OK after about
- a dozen runs. Perhaps it was a bug in CyberGraphX. ... nope, just
- got another 80000003 crash on exit :(
-
- ------------------------------------------------------------------------
- Added code to get ProgramName in amiga_main.c. Added definition of
- ProgramName in m_args.h and m_args.c.
-
- ------------------------------------------------------------------------
- Allocated space for myargv[] in amiga_main.c and copy argv[] across.
- Parse icon tooltypes and convert to additional entries in myargv[]
- and myargc.
-
- ------------------------------------------------------------------------
- Added -screenmode option to set ScreenMode in amiga_video.c
-
- ------------------------------------------------------------------------
- Added -forcedemo option in g_game.c to force demos to play even if
- the version number doesn't match.
-
- ------------------------------------------------------------------------
- Changed handling of $HOME in d_main.c to append a '/' if it doesn't
- already end in a '/' or a ':'.
-
- ------------------------------------------------------------------------
- Added trailing slashes to definitions of DEVMAPS and DEVDATA in
- dstrings.h.
- #define DEVMAPS "devmaps/"
- #define DEVDATA "devdata/"
-
- ========================================================================
- v0.2 1 Jan 1998
- ------------------------------------------------------------------------
- Changed zone management code to allocate between 2Mb and 6Mb instead
- of always 6Mb. ADoom should now work on Amigas with less memory.
- Check result of allocation. Previous version crashed if 6Mb malloc
- failed.
-
- ------------------------------------------------------------------------
- Changed handling of HOME environment variable in d_main.c
-
- ------------------------------------------------------------------------
- The Amiga doesn't have F11 and F12 keys. Changed amiga_video.c to map
- the '[' and ']' keys to F11 and F12. Now gamma correction works.
- Also fixed keypad '+'.
-
- ------------------------------------------------------------------------
- Added joystick code using gameport device in amiga_video.c. Changed
- m_misc.c to enable usejoystick.
-
- ------------------------------------------------------------------------
- Added AmiTCP networking support by writing a new version of
- amiga_net.c based on i_net.c for Linux. Successfully worked to a PC
- running Linux with DOOM compiled from the released DOOM sources.
- Performance was really bad, with lots of jerking, even on ethernet.
- Tried improving performance by making sends non-blocking as well as
- recvs. AmiTCP 4.3 appears to return errno==EINVAL instead of
- errno=EWOULDBLOCK for non-blocking recvfrom() and non-blocking
- sendto() --- seems pretty weird to me, or have I done something wrong?
-
- ========================================================================
- v0.1 30 Dec 97
- ------------------------------------------------------------------------
- Open audio.device on 4 channels and play sound effects in
- amiga_sound.c. Cache up to 12 sound effects in chipmem at a time.
- All other sound effects are cached in fastmem. Audio period is still
- not calculated correctly from pitch. Separation (balance) is ignored,
- so 3D sound effects are not right. Changed s_sound.c to pass channel
- number (cnum) to I_StartSound(). Changed m_misc.c to set 4 channels
- instead of 3.
-
- ------------------------------------------------------------------------
- Deleted calls to I_UpdateSound() and I_SubmitSound() in d_main.c
-
- ------------------------------------------------------------------------
- Stripped 68040-optimised AGA and ECS(EHB) C2P routines out of Flick
- v1.5 and linked them into amiga_video.c. Changed "dirty_list"
- mechanism to a comparison buffer instead. Added amiga_median.c for
- calculating best EHB palette and 8-bit -> 6-bit colour xlate table.
- Changed EHB C2P routine to handle colour translate table (probably not
- entirely efficiently). These routines are not quite state-of-the-art
- (e.g, old merge macro) but they are not bad either. Linked in 68020-
- and Akiko-optimised routines too, but they are not called yet.
-
- ------------------------------------------------------------------------
- Made a minor optimisation speedup to R_DrawColumn().
-
- ========================================================================
- v0.0 28 Dec 97
- ------------------------------------------------------------------------
- Wrote amiga_main.c, amiga_system, amiga_sound.c, amiga_video.c,
- amiga_net.c and smakefile to replace i_main.c, i_system, i_sound.c,
- i_video.c, i_net.c and Makefile respectively. The amiga_sound and
- amiga_net routines are dummies.
-
- ------------------------------------------------------------------------
- Amiga is big-endian. Compiled with DEFINE=__BIG_ENDIAN__. It looks
- like the code hasn't been tested with __BIG_ENDIAN__ for a while. The
- test in m_swap.c for whether swap routines should be included was
- around the wrong way. SwapSHORT() returned an int instead of an
- unsigned short.
-
- ------------------------------------------------------------------------
- Fixed point arithmetic routines in m_fixed.c used (long long) 64-bit
- datatype not available in SAS/C. Replaced with assembly routines in
- amiga_fixed.s. Added check for divide by 0 in FixedDiv() because
- Amiga crashes on divide by 0.
-
- ------------------------------------------------------------------------
- The Unix function alloca() was called from r_data.c, w_wad.c and some
- other files. I replaced with calls to malloc() and added calls to
- free() where each routine returns.
-
- ------------------------------------------------------------------------
- Changed the cache routines in w_wad.c to use the more efficient
- fopen(), fread(), fseek(), fclose() instead of open(), read(),
- lseek(), close(). Changed handles from (int) to (FILE *) everywhere
- including lumpinfo_t structure in w_wad.h. Fixed the filelength()
- function to align stat structure on 4-byte boundary. Used SAS/C
- fileno() function to get file number from (FILE *).
-
- ------------------------------------------------------------------------
- In d_main.c, changed the handling of slashes and double-dots in
- filenames to Amiga conventions.
-
- ------------------------------------------------------------------------
- Moved definition of RANGECHECK from doomdef.h to smakefile. Disabled
- SNDSERV and SNDINTR in doomdef.h.
-
- ------------------------------------------------------------------------
- SAS/C 6.58 appeared to generate bad code for the line:
-
- offsetangle = abs(rw_normalangle-rw_angle1);
-
- in r_segs.c, resulting in corrupted graphics. This took me hours to
- track down. Putting printf() instructions before and after, the code
- calulated abs(1073741824-1927746431)=1073741824 instead of the correct
- answer of 854004607. As far as I could see, it was using the stdlib.h
- definition of abs(), which looks fine. As a workaround, I changed
- abs() to iabs() (SAS/C function) throughout in all sources.
-
- On 5 Jan 98, Michael van Elst <mlelstv@serpens.swb.de> offered the
- following explanation:
-
- >It doesn't. It is an artefact of ANSI C. rw_normalangle is defined
- >as unsigned, rw_angle1 is defined as int. The result of the difference
- >is therefore unsigned. You need something like:
- >
- > offsetangle = abs((int)rw_normalangle - (int)rw_angle1);
- >or offsetangle = abs((long)rw_normalangle - (long)rw_angle1);
- >
- >and make sure that rw_normalangle fits into the positive int or
- >long values.
- >[...]
- >gcc probably doesn't use the macro but an abs(int) function. You
- >get the same with SAS/C if you #undef abs.
-
- ------------------------------------------------------------------------
- Got READ enforcer hits in p_enemy.c at the line:
-
- ld = spechit[numspechit];
-
- Crashed badly shortly afterwards if Enforcer was not running. As far
- as I can tell, the variable numspechit should be in the range 0..7.
- Somehow numspechit gets the value 149551680 (0x8e9fa40). Without
- really knowing what I was doing, I attempted to fix the problem by
- changing the line:
-
- if (ld->special)
-
- in p_map.c to:
-
- if (ld->special && numspechit < MAXSPECIALCROSS)
-
- So far it seems to work.
-
- ------------------------------------------------------------------------
- Disassembled R_DrawColumn() and R_DrawSpan() with OMD, created
- amiga_draw.s and hand-optimised a bit.
-
- ------------------------------------------------------------------------
- Program still often crashes on exit :(
-
- ------------------------------------------------------------------------
-